package com.satan.juc.demo23;

import java.util.concurrent.*;

public class MultipleFutureTasks {
    //在这个示例中，我们创建了三个FutureTask并提交到线程池。
    //然后，我们使用CompletableFuture.allOf来创建一个CompletableFuture，它会等待所有给定的CompletableFuture完成。
    //每个CompletableFuture都是通过runAsync方法创建的，它们分别等待对应的FutureTask完成并打印结果。
    //最后，我们调用allFutures.get()来确保所有任务都已完成。
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        // 创建线程池
        ExecutorService executorService = Executors.newCachedThreadPool();

        // 创建FutureTask列表
        FutureTask<String> futureTask1 = new FutureTask<>(() -> "结果1");
        FutureTask<String> futureTask2 = new FutureTask<>(() -> "结果2");
        FutureTask<String> futureTask3 = new FutureTask<>(() -> "结果3");

        // 提交FutureTasks到线程池
        executorService.submit(futureTask1);
        executorService.submit(futureTask2);
        executorService.submit(futureTask3);

        // 使用CompletableFuture来处理所有FutureTask的结果
        CompletableFuture<Void> allFutures = CompletableFuture.allOf(
                CompletableFuture.runAsync(() -> {
                    try {
                        System.out.println(futureTask1.get());
                    } catch (InterruptedException | ExecutionException e) {
                        e.printStackTrace();
                    }
                }, executorService),
                CompletableFuture.runAsync(() -> {
                    try {
                        System.out.println(futureTask2.get());
                    } catch (InterruptedException | ExecutionException e) {
                        e.printStackTrace();
                    }
                }, executorService),
                CompletableFuture.runAsync(() -> {
                    try {
                        System.out.println(futureTask3.get());
                    } catch (InterruptedException | ExecutionException e) {
                        e.printStackTrace();
                    }
                }, executorService)
        );

        // 等待所有FutureTask完成
        allFutures.get();

        // 关闭线程池
        executorService.shutdown();
    }
}
